'''
某公司要开发新游戏，请用面向对象的思想，设计游戏中的蛇怪和蜈蚣精
设定
1) 蛇怪类:
属性包括：怪物名字，生命值，攻击力
方法包括：攻击，移动（曲线移动），补血（当生命值<10时，可以补加20生命值）
2) 蜈蚣精类：
属性包括：怪物名字，生命值，攻击力
方法包括：攻击，移动（飞行移动）
要求
1) 分析蛇怪和蜈蚣精的公共成员，提取出父类—怪物类
2) 利用继承机制，实现蛇怪类和蜈蚣精类
3) 攻击方法，描述攻击状态。内容包括怪物名字，生命值，攻击力
4) 编写测试类，分别测试蛇怪和蜈蚣精的对象及相关方法
5) 定义名为mon的包存怪物类，蛇怪类，蜈蚣精类和测试类
'''
from abc import abstractmethod

from typing_extensions import override


class monster:
    def __init__(self, name, hp, atk):
        self.__name = name
        self.__hp = hp
        self.__atk = atk

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_hp(self, hp):
        self.__hp = hp

    def get_hp(self):
        return self.__hp

    def set_atk(self, atk):
        self.__atk = atk

    def get_atk(self):
        return self.__atk

    def hit(self):
        print(f"怪物{self.__name}展开攻击")

    @abstractmethod
    def move(self):
        pass

class snake(monster):
    def __init__(self, name, hp, atk):
        super().__init__(name, hp, atk)

    @override
    def move(self):
        print("我是蛇怪，我走S型路线")

    def get_blood(self):
        # 当生命值<10时，可以补加20生命值
        if self.get_hp()<10:
            self.set_hp(self.get_hp()+20)
            print(f"实施大蛇补血术。。。。。，当前生命值是：{self.get_hp()}")

class wugong(monster):
    def __init__(self, name, hp, atk):
        super().__init__(name, hp, atk)

    @override
    def move(self):
        print("我是蜈蚣精，御风飞行")

s1 = snake('蛇妖甲',5,20)
s1.hit()
print(f"当前生命值是:{s1.get_hp()}")
print(f"攻击力是:{s1.get_atk()}")
s1.get_blood()
s1.move()
print("=================================")
s2 = wugong('蜈蚣乙',60,15)
s2.hit()
print(f"当前生命值是:{s2.get_hp()}")
print(f"攻击力是:{s2.get_atk()}")
s2.move()